
#ifndef TEMPCONFIG_H
#define TEMPCONFIG_H

#include "core/IaitoCommon.h"

#include <QString>
#include <QVariant>

/**
 * @brief Class for temporary modifying r2 `e` configuration.
 *
 * Modified values will be restored at the end of scope. This is useful when
 * using a r2 command that can only be configured using `e` configuration and
 * doesn't accept arguments. TempConfig::set calls can be chained. If a command
 * or r2 method accepts arguments directly it is preferred to use those instead
 * of temporary modifying global configuration.
 *
 * \code
 * {
 *     TempConfig tempConfig;
 *     tempConfig.set("asm.arch", "x86").set("asm.comments", false);
 *     return Core()->cmdRaw("pd");
 *     // config automatically restored at the end of scope
 * }
 * \endcode
 */
class IAITO_EXPORT TempConfig
{
public:
    TempConfig() = default;
    ~TempConfig();

    TempConfig &set(const QString &key, const QString &value);
    TempConfig &set(const QString &key, const char *value);
    TempConfig &set(const QString &key, int value);
    TempConfig &set(const QString &key, bool value);

private:
    TempConfig(const TempConfig &) = delete;
    TempConfig &operator=(const TempConfig &) = delete;
    QMap<QString, QVariant> resetValues;
};

#endif // TEMPCONFIG_H
